/********************************************************/
/*	Author:		gong_libin			*/
/*	Date:		2014_08_20			*/
/*	File:		GtDcpRadius.h			*/
/********************************************************/

#ifndef	_GTDCPRADIUS_H
#define	_GTDCRADIUSP_H

#include "GtPro.h"
#include "GtMsg.h"
#include "GtRaw.h"
#include "GtUtl.h"
#include "GtTime.h"
#include "GtDgram.h"
#include "GtThread.h"
#include "GtDcpDef.h"

#include <ctype.h>
#include <getopt.h>
#include <signal.h>
#include <netinet/ip.h>
#include <netpacket/packet.h>

/* RFC 2865 RADIUS June 2000

RADIUS data:
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Code      |  Identifier   |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                         Authenticator                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-

User-Name Attribute:
0                   1                   2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|     Type      |    Length     |  String ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

*/

#define	GT_DR_PORT			1813

#define	GT_DR_ACREQ			1	// Access-Request
#define	GT_DR_ACACP			2	// Access-Accept
#define	GT_DR_ACREJ			3	// Access-Reject
#define	GT_DR_ATREQ			4	// Accounting-Request
#define	GT_DR_ATRES			5	// Accounting-Response

#define	GT_DR_ASTST			1	// Account-Status is start
#define	GT_DR_ASTSP			2	// Account-Status is stop

#define	GT_DR_UNAME			1	// User-Name
#define	GT_DR_NASIP			4	// NAS-IP-Address
#define	GT_DR_FRMIP			8	// Framed-IP-Address
#define	GT_DR_CALLS			31	// Calling-Station-Id
#define	GT_DR_ASTTY			40	// Acct-Status-Type

/* radius type */
typedef struct tagGtDrType
{
	UCHAR m_ucCode;
	UCHAR m_ucIdent;
	USHORT m_usLength;
	char m_szAuthent[GT_BYTE16];
}GTDRTYPE_S;

/* radius attr */
typedef struct tagGtDrAttr
{
	UCHAR m_ucType;
	UCHAR m_ucLength;
}GTDRATTR_S;

typedef struct tagGtDrUser
{
	char m_szUser[GT_BYTE32];
	char m_szNasIP[GT_BYTE16];
	char m_szUsrIP[GT_BYTE16];
	char m_szCalls[GT_BYTE32];
	char m_szStatus[GT_BYTE16];
}GTDRUSER_S;

void* GtDrCore(void* pNet);
void GtDrQuit(int iSignal);
void GtDrUser(GTDRUSER_S* pstUser);
void GtDrQueue(GTDRUSER_S* pstUser);
void GtDrUsrID(char* pszUser, char* pszUsrID);
int GtDrInet(char* pszBind, GtNet::CGtNet* pCNet);
int GtDrUnix(char* pszBind, GtNet::CGtNet* pCNet);

#endif /* _GTDCPRADIUS_H */
